Rust で 画面 の 描画 に使えるライブラリとその基本的な使用方法
目次
画面の描画に使えるライブラリはあるか?
一点を描く関数Result draw_pixel(pixel p)を実装する。
AC.icon 画面の描画に使えるライブラリはあるか?
リサーチしてみる
+ 人気, シンプル
- ウィンドウ管理システムが最適でない winitなどを使うべき(softbufferによれば)
どれもミニマムな機能(ウィンドウ・ピクセル表示)だけを備えていていい感じ
必要最低限の機能だけが揃っていて使いやすい
今回のプログラムにはそれほどの拡張性が要求されない
後で頑張ったら取り替えられる(ウィンドウのセットアップの部分を取り替えればあとは同じ機能が使える)
AC.icon minifbでウィンドウをセットアップする。 code:rs
code:rs
let mut window = Window::new(
"Test - ESC to exit",
WIDTH, HEIGHT,
WindowOptions::default(),
)?;
code:rs
window.set_target_fps(60);
メインループ!
code:rs
while window.is_open() && !window.is_key_down(Key::Escape) {
// 何かbufferに書き込む...
window.update_with_buffer(&buffer, WIDTH, HEIGHT).unwrap();
}
とてもわかりやすくて良いappbird.icon
https://scrapbox.io/files/66ba3301b8f36d001dfd35ad.png
AC.icon 一点を描く関数Result draw_pixel(pixel p)を実装する。
まず、色を表すためのVec3クラスを定義する。
色においては、0を最小値、1を最大値として以後扱う。
code:rs
struct Vec3 {
}
impl Vec3 {
pub fn x(&self) -> f64 { self.e0 } pub fn y(&self) -> f64 { self.e1 } pub fn z(&self) -> f64 { self.e2 } pub fn new(x:f64, y:f64, z:f64) -> Vec3 { Vec3{ e:x, y, z } } }
type Color = Vec3;
次に、window.update_with_bufferが受け取るbufferがどういうデータ形式かを調べる。
Updates the window with a 32-bit pixel buffer. The encoding for each pixel is 0RGB: The upper 8-bits are ignored,
とのことなので、
Colorのベクトルの中身をu32のピクセルバッファに変換する必要がある。
エンコード処理を書く。これで、Colorをバッファに格納する準備ができた。
code:rs
fn encode_color(color:Color) -> u32 {
let r = (color.x() * 255.999).floor() as u32;
let g = (color.y() * 255.999).floor() as u32;
let b = (color.z() * 255.999).floor() as u32;
return (r << 8 * 2) | (g << 8 * 1) | (b << 8 * 0);
}
code:rs
fn draw_pixel(buffer:&mut Vec<u32>, x:usize, y:usize, color:Color) {
let pixel_pos = y * WIDTH + x;
}
従って、こんなコードをメインループに書いてみると
code:rs
for i in 0..30 {
draw_pixel(&mut buffer, i * WIDTH / 30 , HEIGHT / 2, Color::new(1., 1., 1.));
}
https://scrapbox.io/files/66ba37bd2d5c00001d262e37.png
こう言う感じで白点が打たれる。